#pragma once


#include <TFT_eSPI.h>
#include <WiFi.h>

#define WIDTH 240
#define HEIGHT 240
#define BLOCK_LINES 80
#define BLOCK_SIZE (WIDTH * BLOCK_LINES * 2)
#define TAIL_BYTE_1 0xAA
#define TAIL_BYTE_2 0xBB
#define TAIL_BYTE_3 0xCC

/**
 * @class Screen
 * @brief 控制 TFT 屏幕显示的类
 *
 * 提供屏幕初始化、显示启动信息、以及处理来自 WiFiClient 发送的图像数据。
 * 通过面向对象封装屏幕操作，使投屏逻辑独立且可复用。
 */
class Screen {
public:
    /**
     * @brief 构造函数
     *
     * 初始化 TFT_eSPI 对象和内部缓冲区。构造时不初始化屏幕硬件。
     */
    Screen();

    /**
     * @brief 初始化屏幕
     *
     * 包括屏幕硬件初始化、旋转方向设置、字节交换和清屏。
     * 调用该方法后，屏幕准备显示图像和文字。
     */
    void setup();

    /**
     * @brief 显示启动信息
     * @param msg 要显示的文字
     *
     * 在屏幕中心显示一条文字信息，常用于程序启动提示。
     * 自动计算文字大小和居中位置。
     */
    void showStartupMessage(const String &msg);

    /**
     * @brief 显示来自 WiFiClient 的图像数据块
     * @param client 连接的 WiFiClient
     *
     * 从客户端接收一块图像数据（RGB565），校验块尾标志位，
     * 然后显示在屏幕对应位置。支持多块连续显示形成整张图。
     */
    void displayBlock(WiFiClient &client);

private:
    TFT_eSPI tft;                         ///< TFT 屏幕对象
    uint8_t blockBuffer[BLOCK_SIZE + 3];  ///< 用于接收图像块的数据缓冲区
    int yPos = 0;                          ///< 当前显示的行位置（用于分块显示）
};